﻿import type { RequestConfig } from '@umijs/max';
import { message, notification } from 'antd';
import {TokenNameEnum} from "@/common/requestConstant";
import { history } from '@umijs/max';

// 错误处理方案： 错误类型
enum ErrorShowType {
  SILENT = 0,
  UN_AUTHORIZATION = 401,
  SYSTEM_ERROR= 500,
  WARN_MESSAGE = 1,
  ERROR_MESSAGE = 2,
  NOTIFICATION = 3,
  REDIRECT = 9,
}
// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean
  status: number;
  data: any;
  code?: number;
  message?: string;
}

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: (res) => {
      const { status, data, code, message } =
        res as unknown as ResponseStructure;
      console.log('res thrower',res)
      if (status >= 300) {
        const error: any = new Error(message);
        error.name = 'BizError';
        error.info = { code, message, status, data } as ResponseStructure;
        throw error; // 抛出自制的错误
      }
    },
    // 错误接收及处理
    errorHandler: (error: any, opts: any) => {
      console.log('error111',error)
      if (error?.response.status === ErrorShowType.UN_AUTHORIZATION) {
        message.error(error.response.data?.message || '系统错误')
        history.push(`/user/login`);
        return;
      }
      message.error(error.response.data?.message || '系统错误')
      // 我们的 errorThrower 抛出的错误。
      // if (error.name === 'BizError') {
      //   const errorInfo: ResponseStructure | undefined = error.info;
      //   const { status } = errorInfo
      //   if (status >= 300) {
      //     message.error(errorInfo?.message)
      //   }
      // } else if (error.response) {
      //   // Axios 的错误
      //   // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
      //   console.log('error.response',error.response)
      //   message.error(error.response.data?.message);
      // } else if (error.request) {
      //   // 请求已经成功发起，但没有收到响应
      //   // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
      //   // 而在node.js中是 http.ClientRequest 的实例
      //   message.error('None response! Please retry.');
      // } else {
      //   // 发送请求时出了点问题
      //   message.error('Request error, please retry.');
      // }
    },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: RequestConfig) => {

      const url = `/api${config?.url?.concat('?token = 123')}`;
      // 拦截请求配置，进行个性化处理。
      const authHeader = localStorage.getItem(TokenNameEnum.tokenHeaderName)
      if (authHeader) {
        const head = { "X-Access-Token": authHeader};
        return { ...config, url, headers: head};
      }
      return { ...config, url };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response as unknown as ResponseStructure;
      console.log('data',data)
      if (data?.status !== 200) {
        message.error('请求失败！');
      }
      return response;
    },
  ],
};
